let Promise = window.Promise

if (!Promise) {
  Promise = function(executor) {
    executor(this.resolve.bind(this), this.reject.bind(this))
    this._thens = []
  }

  Promise.prototype = {
    then: function(onResolve, onReject, onProgress) {
      this._thens.push({
        resolve: onResolve,
        reject: onReject,
        progress: onProgress
      })
    },

    'catch': function(onReject) {
      this._thens.push({
        reject: onReject
      })
    },

    resolve: function(value) {
      this._complete('resolve', value)
    },

    reject: function(reason) {
      this._complete('reject', reason)
    },

    progress: function(status) {
      let i = 0
      let aThen

      while (aThen = this._thens[i++]) {
        aThen.progress && aThen.progress(status)
      }
    },

    _complete: function(which, arg) {
      this.then = which === 'resolve' ?
        function(resolve) {
          resolve && resolve(arg)
        } :
        function(resolve, reject) {
          reject && reject(arg)
        }

      this.resolve = this.reject = this.progress =
                function() {
                  throw new Error('Promise already completed.')
                }

      let aThen
      let i = 0

      while (aThen = this._thens[i++]) {
        aThen[which] && aThen[which](arg)
      }

      delete this._thens
    }
  }
}

export default Promise
